package com.tarena.lbs.basic.web.service;

import com.tarena.lbs.base.common.utils.Asserts;
import com.tarena.lbs.base.protocol.exception.BusinessException;
import com.tarena.lbs.basic.web.repository.TagRepository;
import com.tarena.lbs.basic.web.repository.UserRepository;
import com.tarena.lbs.basic.web.repository.UserTagsRepository;
import com.tarena.lbs.common.passport.principle.UserPrinciple;
import com.tarena.lbs.common.security.utils.LbsSecurityContenxt;
import com.tarena.lbs.pojo.basic.param.UserTagsParam;
import com.tarena.lbs.pojo.basic.po.TagLibraryPO;
import com.tarena.lbs.pojo.basic.po.UserTagsPO;
import com.tarena.lbs.pojo.basic.vo.ArticleTagVO;
import com.tarena.lbs.pojo.basic.vo.TagLibraryVO;
import com.tarena.lbs.pojo.basic.vo.TagVO;
import com.tarena.lbs.pojo.basic.vo.UserTagVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Slf4j
public class TagService {
    @Autowired
    private TagRepository tagRepository;
    @Autowired
    private UserTagsRepository userTagsRepository;
    @Autowired
    private UserRepository userRepository;
    public Map<String, List<TagVO>> articleTags() {
        //1 查询文章所有的标签 tag_type=0
        List<TagLibraryPO> pos=tagRepository.getTagsByTagType(0);
        //美食 路边摊 网红店 高档酒店 旅游 日记 趣闻 传说
        //美食=[网红店,路边摊,高档酒店] 旅游=[日记,趣闻,传说]
        Map<String,List<TagVO>> tagMap=assembleTagVOMap(pos);
        return tagMap;
    }

    private Map<String, List<TagVO>> assembleTagVOMap(List<TagLibraryPO> pos) {
        //1.判断pos是否是空
        if (CollectionUtils.isEmpty(pos)){
            return null;
        }
        //2.可以从pos筛选出来一级标签 parentId=0  [美食,旅游] filter作用 只保留满足条件的元素
        List<TagLibraryPO> firstLevelTags=
                pos.stream()
                        .filter(po->po.getTagParentId()==0)
                        .collect(Collectors.toList());
        log.info("属于一级标签:{}",firstLevelTags);
        //3.准备一个map对象 向里面封装数据
        Map<String,List<TagVO>> tagMap=new HashMap<>();
        //4.循环一级标签列表 美食(45) 旅游(49)
        for (TagLibraryPO firstLevelTag : firstLevelTags) {
            //key 一级标签名字
            String tagName=firstLevelTag.getTagName();
            //value pos中parentId=当前一级标签id的那些元素所转化的vos
            //拿到当前一级标签下的所有二级标签
            List<TagLibraryPO> secondLevelTags=
                    pos.stream()
                            .filter(po->po.getTagParentId().equals(firstLevelTag.getId()))
                            .collect(Collectors.toList());
            log.info("二级标签:{}",secondLevelTags);
            //实现一个转化 tagLibraryPO转成ArticleTagVO
            List<TagVO> vos=secondLevelTags.stream().map(po->{
                TagVO vo=new TagVO();
                //第一个vo属性就是一级分类的名字
                vo.setTagCategoryName(tagName);
                //第二个属性可以使用po拷贝转化
                TagLibraryVO voTag=new TagLibraryVO();
                BeanUtils.copyProperties(po,voTag);
                vo.setTagLibraryBO(voTag);
                return vo;
            }).collect(Collectors.toList());
            tagMap.put(tagName,vos);
        }
        log.info("封装结束的map:{}",tagMap);
        //5.每循环一次 就可以从pos中查询当前一级标签的下一级标签 list 美食 [网红店,路边摊,高档酒店]
        //6. 将pos转成vos 将美食作为key 将vos作为value放到map中
        return tagMap;
    }


    public Map<String, List<TagVO>> userTags() {
        //1.查询用户所有的标签 tag_type=1 list 包含用户下一级标签 和二级标签
        List<TagLibraryPO> pos=tagRepository.getTagsByTagType(1);
        //2.数据转化
        return assembleTagVOMap(pos);
    }

    public void bindUserTags(UserTagsParam param) throws BusinessException {
        //1.获取登录信息抛异常
        UserPrinciple userPrinciple = LbsSecurityContenxt.getLoginToken();
        Asserts.isTrue(userPrinciple==null,new BusinessException("-2","用户认证失败"));
        //2.保证幂等 删除当前用户关联的所有标签 delete from lbs_user_tags where user_id=#{}
        userTagsRepository.deleteByUserId(userPrinciple.getId());
        //3.封装批量数据 写入 tagIds 1,2,3,4,5 userId 5107 一共插入五条
        //两种 一种mybatis-plus做不好 mybatis映射文件 找到mybatis-plus用法 不在数据层接口
        List<UserTagsPO> poParams=new ArrayList<>();
        String[] split = param.getTagIds().split(",");
        for (String strTagId: split) {
            Integer tagId=Integer.valueOf(strTagId);
            UserTagsPO poParam=new UserTagsPO();
            poParam.setTagId(tagId);
            poParam.setUserId(userPrinciple.getId());
            poParams.add(poParam);
        }
        userTagsRepository.saveBatch(poParams);
        //4.绑定成功之后 用户状态 status=1
        userRepository.updateStatusById(userPrinciple.getId(),1);
    }
}


















